﻿#include <iostream>
#include <string>
#include <fstream>

int main()
{
    std::cout << "Hello World!\n";



    char strBuf[11]{};
    // 最多读取10个字符
    std::cin.getline(strBuf, 11);
    std::cout << strBuf << '\n';

    // 再最多读取10个字符
    std::cin.getline(strBuf, 11);
    std::cout << strBuf << '\n';

    // ofstream 被用来输出数据到文件
    // 这里打开一个文件 Sample.txt
    std::ofstream outf{ "Sample.txt" };

    // 如果打开文件失败
    if (!outf)
    {
        // 打印错误并退出
        std::cerr << "Uh oh, Sample.txt could not be opened for writing!\n";
        return 1;
    }

    // 写入两行数据
    outf << "This is line 1\n";
    outf << "This is line 2\n";



    // ifstream 被用来读取文件
    // 读取的文件名称为 Sample.txt
    std::ifstream inf{ "Sample.txt" };

    // 如果文件打开失败
    if (!inf)
    {
        // 打印错误并退出
        std::cerr << "Uh oh, Sample.txt could not be opened for reading!\n";
        return 1;
    }

    /*Ios seek 标记	含义
    beg	偏移量，相对于文件开头（默认行为）
    cur	偏移量相对于当前文件指针的位置
    end	偏移量，相对与文件结尾*/

    inf.seekg(14, std::ios::cur); // 向前移动 14 bytes
    inf.seekg(-18, std::ios::cur); // 向后移动 18 bytes
    inf.seekg(22, std::ios::beg); // 移动到文件中的第22个byte
    inf.seekg(24); // 移动到文件中的第22个byte
    inf.seekg(-28, std::ios::end); // 移动到文件结尾前的倒数第28个byte


    std::string strData;

    inf.seekg(5); // 移动到第5个字符
    // 获取当前一行，并打印，然后文件指针移动到第2行
    std::getline(inf, strData);
    std::cout << strData << '\n';

    inf.seekg(8, std::ios::cur); // 从当前位置，向前再移动8个byte
    // 获取当前行剩余的数据，并打印
    std::getline(inf, strData);
    std::cout << strData << '\n';

    inf.seekg(-14, std::ios::end); // 移动到文件结尾前的倒数第14个byte
    // 获取当前行剩余的数据，并打印
    std::getline(inf, strData); // 未定义的行为
    std::cout << strData << '\n';

    // 如果有可以读取的数据
    std::string strInput{};
    while (inf >> strInput)
        std::cout << strInput << '\n';



    std::ofstream outf{ "Sample.txt" };
    outf << "This is line 1\n";
    outf << "This is line 2\n";
    outf.close(); // 显示关闭文件

    // Oops, 这里以追加模式再打开文件
    outf.open("Sample.txt", std::ios::app);
    outf << "This is line 3\n";
    outf.close();
}
